package com.luo.config;

import org.apache.ibatis.javassist.NotFoundException;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;


@Component
@Aspect
public class LogAspect {
    private Logger logger = LoggerFactory.getLogger(LogAspect.class);

    //设置切点表达式
    @Pointcut("execution(* com.luo.*..*(..))")
    private void pointcut(){

    }
    @Before(value = "pointcut()")
    public void Before(JoinPoint joinPoint) throws Exception{
        //拿到切面的类名、方法名、方法参数
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        //反射加载切点类，遍历类中所有方法
        Class<?> targetClass = Class.forName(className);
        Method[] methods = targetClass.getMethods();
        for (Method method : methods) {
            //如果遍历到类中的方法名与切点的方法名一致，并且参数个数也一致，就说明切点找到了
            if(method.getName().equalsIgnoreCase(methodName)){
                Class<?>[] clazzs = method.getParameterTypes();
                if(clazzs.length==args.length){
                    //获取到切点上的注解
                    Log log = method.getAnnotation(Log.class);
                    if(log!=null){
                        //获取注解的信息并输出
                        String logStr = log.logStr();
                        logger.warn(className+"."+methodName+"()-->"+logStr);
                        break;
                    }
                }
            }
        }
    }

//    //方法后置切面
//    @After(value = "pointcut()")
//    public void After(JoinPoint joinPoint) throws NotFoundException,ClassNotFoundException{
//        //拿到切面的类名、方法名、方法参数
//        String className = joinPoint.getTarget().getClass().getName();
//        String methodName = joinPoint.getSignature().getName();
//        Object[] args = joinPoint.getArgs();
//        //反射加载切点类，遍历类中所有方法
//        Class<?> targetClass = Class.forName(className);
//        Method[] methods = targetClass.getMethods();
//        for (Method method : methods) {
//            //如果遍历到类中的方法名与切点的方法名一致，并且参数个数也一致，就说明切点找到了
//            if(method.getName().equalsIgnoreCase(methodName)){
//                Class<?>[] clazzs = method.getParameterTypes();
//                if(clazzs.length==args.length){
//                    //获取到切点上的注解
//                    Log log = method.getAnnotation(Log.class);
//                    if(log!=null){
//                        logger.warn(className+"."+methodName+"()-->"+"访问切面成功！");
//                        //数据库记录操作...dk
//                        break;
//                    }
//                }
//            }
//        }
//    }
}
